package com.xiangxg.jvm.gc;
/*
    PSYoungGen：Parallel Scavenge JDK1.8的默认垃圾新生代收集器
    ParOldGen：Parallel Old JDK1.8的默认垃圾老年代收集器
    -XX:+PrintGC 输出GC简要日志（非稳定版）
    -verbose:gc 输出gc简要日志（稳定版）与-XX:+PrintGC功能相同
    -Xms:堆空间最小值
    -Xmx：堆空间最大值
    -Xmn:堆当中的新生代大小
    -XX:+PrintGCDetails 打印垃圾回收的详细信息
    -XX:SurvivorRatio=8
    -verbose:gc -Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails -XX:SurvivorRatio=8
 */
public class MyTest1 {
    public static void main(String[] args) {
        int size = 1024 *1024;//1M
        byte[] myAlloc1 = new byte[2 *size];//2M
        byte[] myAlloc2 = new byte[2 *size];//2M
        //1.Minor GC测试
        //打开下面代码行占用7M内存，注释触发Minor GC。因为eden区总共8m,加上系统类对象占用的空间，会使eden区内存满，触发MinorGC
        /*
        jvm配置新生代10M,堆空间20M。
        gc信息如下
        [GC (Allocation Failure) [PSYoungGen: 5243K（回收前）->664K（回收后）(9216K)] 5243K->4768K(19456K), 0.0034372 secs(垃圾回收占用时间)] [Times: user=0.00（用户空间） sys=0.00（系统内核）, real=0.00 secs（实际）]
         gc日志显示，新生代共9M(9216K),堆空间19M(19456K)。原因由于SurvivorRatio=8，一个占1M的survivor空间会被浪费，不会算在内

         PSYoungGen代表新生代采用的是Parallel Scavenge垃圾收集器，采用复制算法，关注吞吐量，可能会存在较长时间的stop the word,
         （个人意见，作为JDK1.8默认垃圾收集器，不太适合做为WEB类型项目的垃圾收集器）
         */

        /*
            PSYoungGen      total 9216K, used 3974K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
              eden space 8192K, 40% used [0x00000000ff600000,0x00000000ff93b9e0,0x00000000ffe00000)
              from space 1024K, 64% used [0x00000000ffe00000,0x00000000ffea6010,0x00000000fff00000)
              to   space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
             ParOldGen       total 10240K, used 4104K （老年代占用空间）[0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
              object space 10240K, 40% used [0x00000000fec00000,0x00000000ff002020,0x00000000ff600000)
             Metaspace       used 2698K, capacity 4486K, committed 4864K, reserved 1056768K
              class space    used 288K, capacity 386K, committed 512K, reserved 1048576K

              5243K-664K=4579k //执行完gc后，新生代释放的空间容量。新生代有一部分未被回收，而是晋升到了老年代，故释放的空间比整个堆空间释放的容量大
              5243K-4768K=475k //执行完gc后，堆空间释放的空间

              4579k-475k=4104k //执行完gc后,晋升到老年代空间的容量
         */
        //byte[] myAlloc3 = new byte[3 *size];

        //2.Full GC测试 打开下面两行代码注释，触发Full GC
        /*
            当分配 2M,2M,3M,3M 四个对象时不会触发FULL GC
            当分配 2M,2M,2M,2M 四个对象时会触发FULL GC
        [Full GC (Ergonomics) [PSYoungGen: 680K->0K(9216K)] [ParOldGen: 6152K->6683K(10240K)] 6832K->6683K(19456K), [Metaspace: 2690K->2690K(1056768K)], 0.0074867 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

         */
        //当新生代无法容纳新创建的对象时，将直接放入老年代
        byte[] myAlloc4 = new byte[2 *size];
        byte[] myAlloc5 = new byte[3 *size];
        System.out.println("hello world");
    }
}
